/*
 * FileSyncHandler.h
 *
 * Esta entidad se encarga de actualizar explicitamente el repo local, es decir, de la
 * correcta sincronizacion y actualizacion de data en los archivos y en el indice
 * */

#ifndef FILESYNCHANDLER_H_
#define FILESYNCHANDLER_H_

#include <string>
#include <list>
#include <cstring>
#include <algorithm>

#include "DiferenciaGetNewFile.h"
#include "DiferenciaModifiedFile.h"
#include "DiferenciaGetDeletedFile.h"

#include "ObtenerContenidosArchivo.h"

#include "FileDateModification.h"
#include "FileInfo.h"

#include "MyException.h"

#include <stdint.h>

#include "MD5.h"

#include <cstdio>	// remove()

class FileSyncHandler {
	std::fstream& indiceHashes;
	std::string dirPath;
	std::string indexPath;
	std::list<Diferencia*> diferencias;

	public:
		FileSyncHandler(std::string pathRepo, std::fstream& indice,
				std::string pathIndex);
		virtual ~FileSyncHandler();

		// Borra un archivo del repo
		void borrarArchivo(const char* filename);
		// Crea un archivo nuevo en el repo
		void crearArchivo(const char* filename, const char* data);
		// Mergea lista de archivos que se envia del server (GET-FILE-LIST)
		void mergearRepos(const std::list<FileInfo>& files,
				const std::list<std::string>& oldHashes);
		/* Devuelve la lista de diferencias para actualizar con el server
		 * mas si borra archivos correspondientes
		 */
		std::list<Diferencia*> getListaDiferencias() {return (this->diferencias);}
		std::string getSyncPath() {return (this->dirPath);}

		// Me hace una copia de archivo conflictivo de backUp
		void backUpFile (const std::string& filename);

		void escribirArchivoAIndice(std::fstream& indice, const std::string& nombre,
				const std::string& data, const FileDateModification& fechaMod);

		void getArchivoIndice(std::fstream& indice, std::string& nombre,
				std::string& hash, FileDateModification& fechaMod);

		void actualizarIndice(const std::string& filename);

		std::string getHashArchivo(const std::string& filename);

		// Para borrar el repositorio local
		void borrarTodo();
};

#endif
